linux 多架构支持
·
Debian 多架构(Multiarch) 与 跨架构模拟(QEMU + binfmt_misc)
- dpkg --add-architecture + apt install -d 不依赖 QEMU/binfmt
- 但若想 运行 vim:arm64,就必须用 QEMU/binfmt
- Multiarch 解决“如何下载/解压 arm64 包”
- QEMU/binfmt 解决“如何执行 arm64 二进制”
dpkg --print-architecture
dpkg --print-foreign-architectures
# 即使没装 qemu-user-static,也能下载
sudo apt purge qemu-user-static 2>/dev/null
sudo apt clean
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt-get install -d vim:arm64 # ✅ 成功!
dpkg -x /var/cache/apt/archives/vim_*.deb ./vim-arm64
# 尝试运行
./vim-arm64/usr/bin/vim --version
# ❌ 报错:bash: ./vim-arm64/usr/bin/vim: cannot execute binary file: Exec format error
sudo apt install qemu-user-static
./vim-arm64/usr/bin/vim --version
# ✅ 成功
| 目标 | 所需技术 | 命令示例 |
|---|---|---|
| 下载 arm64 .deb | Multiarch | dpkg --add-architecture arm64 && apt install -d vim:arm64 |
| 解压 arm64 文件 | Multiarch | dpkg -x vim_arm64.deb ./ |
| 运行 arm64 二进制 | QEMU + binfmt | apt install qemu-user-static && ./vim |
| 容器中跑 arm64 | QEMU + binfmt + OCI | podman run --platform=linux/arm64 arm64v8/alpine |
| 交叉编译 arm64 | Multiarch + gcc | apt install gcc-aarch64-linux-gnu && aarch64-linux-gnu-gcc hello.c |
常见问题
如果只做 ① 和 ②,会怎样?
dpkg --add-architecture arm64
apt install vim:arm64
# 然后运行:
/usr/bin/vim
# 可能得到:
# cannot execute binary file: Exec format error
# 因为:
# 系统能装包
# 但内核不知道如何执行 arm64 ELF
如果有 QEMU 但没有 binfmt_misc?
# 你可以:
qemu-aarch64-static /usr/bin/vim
# 但不能直接:
/usr/bin/vim
# 因为:
# 内核不会自动调用 qemu
如果有 binfmt_misc 但没有 QEMU?
# 那么执行会变成:
# No such file or directory
# 因为:
# 内核要调用 /usr/bin/qemu-aarch64-static
# 结果命令不存在
binfmt_misc
内核机制:自动调用解释器运行异构二进制
docker run --privileged --rm tonistiigi/binfmt --install all
docker run -it --rm --platform=linux/loong64 loongarch64/debian uname -a
# qemu-user-static # 提供 /usr/bin/qemu-*-static 二进制
# binfmt-support # Debian/Ubuntu 专用:管理 binfmt_misc 持久化
# binfmt-support 会在安装时:
# 将预定义的注册规则写入 /var/lib/binfmt-support/
# 创建 systemd 服务:systemd-binfmt.service
# 启用服务:systemctl enable systemd-binfmt
# 系统级预装 QEMU + binfmt # Debian/Ubuntu # Fedora/RHEL
sudo apt install qemu-user-static binfmt-support
sudo dnf install qemu-user-static
# 用 rootful Podman(临时 sudo)
sudo podman run --privileged --rm tonistiigi/binfmt --install all
# 普通用户运行容器(rootless 安全!)
podman run -it --rm --platform=linux/loong64 loongarch64/debian uname -a
## 复杂、会话级有效、重启失效 —— 不如一句 sudo apt install qemu-user-static
# 1. 创建用户命名空间并挂载 binfmt_misc
unshare --user --map-root-user --mount sh -c '
mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
podman run --rm -v /proc/sys/fs/binfmt_misc:/proc/sys/fs/binfmt_misc:rw tonistiigi/binfmt --install loong64
'
# 2. 保持命名空间 alive(后台)
unshare --user --map-root-user --mount --fork sleep infinity &
NS_PID=$!
# 3. 在该命名空间中运行容器
nsenter -U -m -t $NS_PID podman run --platform=linux/loong64 uname -a